package com.service.tools.utls;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author TangZuQiang
 * @Email tangzuqiang2021@126.com
 * @createTime 2025/9/11 17:59
 **/
@Slf4j
public class DateUitls {

    /**
     * 获取最近N月的时间字符串
     * @param args 参数，第一个参数为最近N月，第二个参数为时间格式
     * @return 时间字符串列表
     */
    public static List<String> getNMonthDateStrings(Object...  args) {
        int n = 0;
        String format = "yyyyMM";
        switch (args.length) {
            case 1:
                n = (int) args[0];
                break;
            case 2:
                n = (int) args[0];
                format = (String) args[1];
                break;
        }
        List<String> dateStrings = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        int i = 0;
        while (i < n) {
            LocalDate date = LocalDate.now().minusMonths(i);
            dateStrings.add(date.format(formatter));
            i++;
        }
        return dateStrings;
    }


    /**
     * 将上海时间字符串转换为 ISO8601 时间字符串
     * @param shanghaiTime 上海时间字符串，格式如 "2025-09-11 16:54:00"
     * @return ISO8601 格式时间字符串
     */
    public static String convertShanghaiToISO8601(String shanghaiTime) {
        // 定义输入格式
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ZonedDateTime shanghaiZonedDateTime = LocalDateTime
                .parse(shanghaiTime.trim(), inputFormatter)
                .atZone(ZoneId.of("Asia/Shanghai"));

        // 转换为 UTC 并格式化
        return shanghaiZonedDateTime
                .withZoneSameInstant(ZoneId.of("UTC"))
                .truncatedTo(java.time.temporal.ChronoUnit.MILLIS)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
    }


    /**
     * 获取未来N天的时间字符串
     * @param args 天数（正数表示未来，负数表示过去）, 时间格式
     * @return 指定日期的时间字符串
     */
    public static String getFutureDateString(Object...  args) {
        int days = 0;
        try {
            String format = "yyyy-MM-dd";
            switch (args.length) {
                case 1:
                    days = (int) args[0];
                    break;
                case 2:
                    days = (int) args[0];
                    format = (String) args[1];
                    break;
            }
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
            LocalDate futureDate = LocalDate.now().plusDays(days);
            return futureDate.format(formatter);
        } catch (Exception e) {
            return LocalDate.now().plusDays(days).toString();
        }
    }

    // ... 现有代码 ...

    /**
     * 获取未来N月的时间字符串
     * @param args 参数，第一个参数为未来N月，第二个参数为时间格式
     * @return 未来N月的时间字符串
     */
    public static String getFutureNMonthDateString(Object... args) {
        int months = 0;
        String format = "yyyy-MM";

        try {
            switch (args.length) {
                case 1:
                    months = (int) args[0];
                    break;
                case 2:
                    months = (int) args[0];
                    format = (String) args[1];
                    break;
            }

            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
            LocalDate futureDate = LocalDate.now().plusMonths(months);
            return futureDate.format(formatter);
        } catch (Exception e) {
            // 发生异常时返回默认格式的未来N月日期
            LocalDate futureDate = LocalDate.now().plusMonths(months);
            return futureDate.toString();
        }
    }

    /**
     * 将上海时间字符串转换为10位时间戳
     * @param shanghaiTime 上海时间字符串，格式如 "2025-09-11 16:54:00"
     * @return 10位时间戳（秒级）
     */
    public static long convertShanghaiToTimestamp(String shanghaiTime) {
        try {
            // 定义输入格式
            DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTime localDateTime = LocalDateTime.parse(shanghaiTime.trim(), inputFormatter);

            // 转换为上海时区的ZonedDateTime
            ZonedDateTime shanghaiZonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));

            // 转换为秒级时间戳
            return shanghaiZonedDateTime.toEpochSecond();
        } catch (Exception e) {
            log.error("时间转换错误：{}", e.getMessage());
            return 0L;
        }
    }

}
